/* 
 * File:   StaffAssist.cpp
 * Author: batista
 * 
 * Created on 18 de Março de 2013, 21:00
 */

#include "ThreadStaffAssist.h"

ThreadStaffAssist::ThreadStaffAssist() : JoinableThread() {
    //    
    tmut = new TimeUtil();
    //
    ShowMessage("Construtor(): ThreadStaffAssist()!!", COLOR_BLUE, COLOR_PINK);
}

ThreadStaffAssist::~ThreadStaffAssist() {

}

/**
 * Metodo principal da Thread
 */
void ThreadStaffAssist::run() {
    int i;
    //long tmin = 2100000; //2100000 = 35 minutos, para 5 = 300000, 1 = 60000
    //
    ShowMessage("ThreadMngRfidCard()", COLOR_PINK, COLOR_GREEN);
    //
    
    ::sleep(6);
    
    /* Pega o time-out para os atendimentos dos eventos */
    timeout_attend = dbconn->getTimeOutForAttend();

    /**
     * Pega a hora para ser comparado o
     * tempo de atendimento para eventos
     * que forem encontrados sem ter sido
     * finalizados.
     */
    time_to_apply = tmut->getTime();

    //Loop infinito
    while (1) {
        //Aguarda um segundo
        tmut->SleepSeg(getTimeoutAssist()); // = ((tempo em min*60)*1000)
        //
        ShowMessage("(  PROCURANDO EVENTOS PARA SEREM ASSISTIDOS )", COLOR_BLUE, COLOR_PINK);
        //
        RunStaffAssist();

        /**
         * Pega uma nova hora para 
         * comparacao.
         */
        time_to_apply = tmut->getTime();
    }
    //
}

/**
 * Metodo responsavel por fazer a pesquisa 
 * para os eventos pendentes na base de 
 * dados.
 */
void ThreadStaffAssist::RunStaffAssist() {
    //
    vector<Event*> vec_events;

    std::string query = "SELECT id, date_time_called "
            " FROM data_protocol "
            " WHERE date_time_called <= '" + time_to_apply +
            "'AND date_time_exited IS NULL";

    vec_events = dbconn->getAllEventToApplyAssist(query);

    /**
     * Se encontrar eventos
     * valida eles
     */
    if (!vec_events.empty()) {
        /**
         * Valida e assist os 
         * eventos pendentes
         **/
        AssistEvents(vec_events);
    }

}

/**
 * Metodo responsavel por atender os evento
 * em aberto na base de dados.
 * @param vec_events
 */
void ThreadStaffAssist::AssistEvents(vector<Event*> vec_events) {
    std::string date_with_timeout, query, data_caputured;

    ShowMessage("FINALIZA UM EVENTO PENDENTE!!", COLOR_BLUE, COLOR_PINK);

    event = new Event();

    for (int i = 0; i < vec_events.size(); i++) {
        event = vec_events.at(i);

        data_caputured = "Evento Capturado:\nProtocol ID: " + tmut->ConvLongToString(event->GetPtlId()) +
                "\nData: " + event->GetDate_Time_Called() + "\n\n";

        cout << FG_MAGENTA << data_caputured << END << endl;

        //Pega a data com time-out
        date_with_timeout = tmut->SumTimeOut(event->GetDate_Time_Called(), getTimeout_attend());

        //Monta query com time-out
        query = "UPDATE data_protocol SET date_time_exited ='" + date_with_timeout
                + "', status_exited='t' WHERE id = '" + tmut->ConvLongToString(event->GetPtlId()) + "'";


        //Pasta onde serar gravado o arquivo
        dirfl->setFolder_write("/Logs/Staff/");
        //     

        //Aguarda um segundo
        //tmut->SleepSeg(100);
        dirfl->CreateLogFile("EVENTS-OLDS", data_caputured);
        //tmut->SleepSeg(1000);

        //Atualiza na base de dados
        dbconn->runQueryInPGree(query);
    }

}
